package com.medsci.yxdplus.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

//@Configuration
public class GeneratorCodeConfig {

    @Autowired
    private String table;

//    @Value("${spring.datasource.url}")
    private String dbUrl = "jdbc:mysql://47.101.63.219:3306/yxdplus_2.0?useUnicode=true&characterEncoding=utf8";

//    @Value("${spring.datasource.username}")
    private String dbUsername="yxdplus";

//    @Value("${spring.datasource.password}")
    private String dbPassword="fwvk8F@hDr7K#2%S";

//    @Value("${spring.datasource.driver-class-name}")
    private String dbDriver="com.mysql.cj.jdbc.Driver";

    public GeneratorCodeConfig(String table) {
        this.table = table;
    }

    public void exec() {
        System.out.println(this.dbDriver);
        // 全局配置
        GlobalConfig globalConfig = globalConfig();

        // 数据源配置
        DataSourceConfig dataSourceConfig = dataSourceConfig();

        // 策略配置
        StrategyConfig strategyConfig = strategyConfig();

        // 包名策略配置
        PackageConfig packageConfig = packageConfig();

        // 整合配置
        AutoGenerator autoGenerator = new AutoGenerator();
        autoGenerator.setGlobalConfig(globalConfig)
                .setDataSource(dataSourceConfig)
                .setStrategy(strategyConfig)
                .setPackageInfo(packageConfig);

        autoGenerator.execute();
    }

    /**
     * 全局配置
     * @return
     */
    private GlobalConfig globalConfig() {
        GlobalConfig config = new GlobalConfig();
        // 是否开启AR模式
        config.setActiveRecord(false)
                // 作者
                .setAuthor("wenjoying@126.com")
                //生成路径
                .setOutputDir(System.getProperty("user.dir") + "/src/main/java")
                //文件是否覆盖
                .setFileOverride(true)
                // 主键策略
                .setIdType(IdType.AUTO)
                //默认情况下生成的Service接口的名字首字母都带有I
                .setServiceName("%sService")
                //不生成impl
                .setServiceImplName(null)
                // 是否生成基本的sql中的ResultMap
                .setBaseResultMap(true)
                // 是否开启api文档
                .setSwagger2(true)
                // 是否生成基本的sql列
                .setBaseColumnList(true);
        return config;
    }

    /**
     * 数据源配置
     * @return
     */
    private DataSourceConfig dataSourceConfig() {
        DataSourceConfig dsconfig = new DataSourceConfig();
        // 设置数据库类型
        dsconfig.setDbType(DbType.MYSQL);
        dsconfig.setDriverName(this.dbDriver);
        dsconfig.setUrl(this.dbUrl);
        dsconfig.setUsername(this.dbUsername);
        dsconfig.setPassword(this.dbPassword);
        return dsconfig;
    }

    /**
     * 策略配置
     * @return
     */
    private StrategyConfig strategyConfig() {
        StrategyConfig strategyConfig = new StrategyConfig();

        // 是否大写命名
        strategyConfig.setCapitalMode(true);
//        strategyConfig.setTablePrefix("sys_"); // 表前缀

        // 从数据库表到文件的命名策略
        strategyConfig.setNaming(NamingStrategy.underline_to_camel);

        // 生成的表名
        strategyConfig.setInclude(this.table);
        return strategyConfig;
    }

    /**
     * 包名策略配置
     * @return
     */
    private PackageConfig packageConfig() {
        PackageConfig packageConfig = new PackageConfig();
        // 所需要生成的包下
        packageConfig.setParent("com.medsci.yxdplus");
        // 设置实体生成包名
        packageConfig.setEntity("entity");
        // 设置控制层包名，以下以此类推
        packageConfig.setController("controller");
        packageConfig.setService("service");
        packageConfig.setMapper("dao");
        packageConfig.setXml("mapper");

        return packageConfig;
    }
}
